﻿#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory>//智能指针头文件
using namespace std;
struct Date
{
	int _year;
	int _month;
	int _day;
	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{
	}
	~Date()
	{
		cout << "~Date()" << endl;
	}
};

int main()
{
	auto_ptr<Date> ap1(new Date);
	// 拷⻉时，管理权限转移，被拷⻉对象ap1悬空
	auto_ptr<Date> ap2(ap1);
	// 空指针访问，ap1对象已经悬空
	//ap1->_year++;
	unique_ptr<Date> up1(new Date);
	// 不⽀持拷⻉
	//unique_ptr<Date> up2(up1);
	// ⽀持移动，但是移动后up1也悬空，所以使⽤移动要谨慎
	unique_ptr<Date> up3(move(up1));
	//可以拷贝可以移动，通过引用计数实现
	shared_ptr<Date> sp1(new Date);
	// ⽀持拷⻉
	shared_ptr<Date> sp2(sp1);
	cout << sp1.use_count() << endl;
	cout << sp2.use_count() << endl;
	shared_ptr<Date> sp3(sp2);
	cout << sp1 << endl;
	cout << sp2 << endl;
	cout << sp3 << endl;
	if (!sp1)
	{
		cout<<"sp1为空"<<endl;
	}
	if (sp2.operator bool())
	{
		sp2.reset();//手动释放
		cout << "sp2非空" << endl;
	}
	sp1->_year++;
	cout << sp1->_year << endl;
	cout << sp2->_year << endl;
	cout << sp3->_year << endl;
	Date* ptr = sp2.get();
	cout<<ptr<<endl;
	// ⽀持移动，但是移动后sp1也悬空，所以使⽤移动要谨慎
	shared_ptr<Date> sp4(move(sp1));
	//shared_ptr支持以下写法
	shared_ptr<Date[]>sp5(new Date[10]);
	return 0;
}

